/**
 * 上下文助手
 */



export default async (server) => {
    return {
        /**
         * 扩展属性：令牌
         * 生成token
         * 验证token
         * 更新token关联的缓存数据
         * 清除token
         */
        get token() {
            return {
                /**
                 * 生成token
                 * - 登录用户表主键生成token
                 * - 登录用户表主键作为key关联用户数据缓存
                 * @param {Object} data 登录用户表数据及联结表数据
                 * @return {String} 返回token【永不过期，携带用户表主键pk信息】
                 */
                async create(data = {}) {
                    // 生成token
                    const token = await server.jwt.sign({ pk: data.pk }, server.config.jwt.secret);
                    // token存储到缓存
                    server.cache.set(data.pk, data);
                    return token;
                },
                /**
                 * 验证token
                 * - 使用jwt验证真实性和完整性
                 * - 通过token获取登录用户表PK
                 * - 通过登录用户表PK获取用户信息
                 * @param {String} token 
                 * @return {Boolean} 验证成功返回用户信息，验证失败返回false
                 */
                async verify(token = '') {
                    const jwtVerify = await new Promise((resolve) => { 
                        server.jwt.verify(token, server.config.jwt.secret, (err, decoded) => {
                            if (err) {
                                resolve(false);
                            } else if (decoded.pk) {
                                const tokenData = server.cache.get(decoded.pk);
                                if (tokenData) {
                                    resolve(tokenData)
                                } else {
                                    resolve(false);
                                }
                            } else {
                                resolve(false);
                            }
                        })
                    })
                    return jwtVerify;
                },
                /**
                 * 更新用户缓存数据
                 * - 用于同步登录用户表的数据库与缓存的数据
                 * @param {String} pk 用户表PK 
                 */
                async update(pk, data) {
                    if (pk) {
                        const _has = server.cache.has(pk);
                        if (_has) {
                            // 更新token
                            server.cache.set(pk, data);
                        }
                    }
                },
                /**
                 * 删除用户缓存数据
                 * @param {*} pk 
                 */
                async delete(pk) {
                    if (pk) {
                        const _has = server.cache.has(pk);
                        if (_has) {
                            // 更新token
                            server.cache.delete(pk);
                        }
                    }
                },
                /**
                 * 清除token用户持有令牌
                 * @param {String} token 
                 */
                async clear(token) {
                    server.jwt.verify(token, server.config.jwt.secret, (err, decoded) => { 
                        if (decoded?.pk) {
                            const _has = server.cache.has(decoded.pk);
                            if (_has) {
                                // 删除缓存的用户数据
                                server.cache.delete(decoded.pk);
                            }
                        }
                    })
                    return true;
                }
            }
        }
    }
}